package comunicacion;

import control.ManejadorMensajesEntrada;
import estado.EstadoCliente;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class InterfazRecibe extends Thread{
    
    private BufferedInputStream buffer;
    private ObjectInputStream objin;
    private Socket socket;
    private EstadoCliente estadoCliente;
    private ManejadorMensajesEntrada manejadorMsjEntrada;
    
    public InterfazRecibe(Socket socket, EstadoCliente estadoCliente, ManejadorMensajesEntrada manejadorMsjEntrada){
        this.socket = socket;
        this.estadoCliente = estadoCliente;
        this.manejadorMsjEntrada = manejadorMsjEntrada;
        manejadorMsjEntrada.setInterfazRecibe(this);
        this.start();
    }

    public void cerrarConexion(){
        try {
            socket.close();
        } catch (IOException ex) {
            Logger.getLogger(InterfazRecibe.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void run(){
        try {
            buffer = new BufferedInputStream(socket.getInputStream());
            objin = new ObjectInputStream(buffer);
            buffer.mark(10); // buffer.mark() es una bandera al estado actual del buffer de entrada del socket.
            while ( !(socket.isClosed()) && (buffer.read() != -1)) {
                // buffer.read() bloquea el hilo mientras no haya nueva entrada en el buffer del socket,
                // pero modifica el contenido, por lo que luego de usarlo hay que usar buffer.reset()
                buffer.reset(); // para volver al estado anterior a esa lectura.
                estadoCliente.recibeDeSocket(objin, manejadorMsjEntrada); // Luego de recibir y desserializar un mensaje del buffer, hago mark de nuevo.
                buffer.mark(10);
            }
        } catch (IOException ex) {
            System.exit(0);
            Logger.getLogger(InterfazRecibe.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
